package org.kiwi.util;

import org.apache.commons.lang3.StringUtils;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.regex.Pattern;

/**
 * Created by jack08.liu on 2016/8/10.
 */
public class IPUtil {

    public static final String IP_REG = "((?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d))))";

    /**
     * 从字符串中解析出ip列表
     *
     * @param addresses
     * @return
     */
    public static List<String> string2IpList(String addresses) {
        List<String> addressList = new ArrayList<>();

        if (StringUtils.isNotEmpty(addresses)) {
            for (String ip : addresses.split("\\s*,\\s*")) {
                ip = ip.trim();
                if (StringUtils.isEmpty(ip)) {
                    continue;
                }
                if (Pattern.matches(IP_REG, ip)) {
                    addressList.add(ip);
                } else {
                    throw new IllegalArgumentException("address invalid, " + ip);
                }
            }
        }

        return addressList;
    }

    /**
     * 获取本地IP
     */
    public static String getLocalIP() {
        String ipAddrStr = "";
        try {
            InetAddress addr = InetAddress.getLocalHost();
            byte[] ipAddr = addr.getAddress();
            for (int i = 0; i < ipAddr.length; i++) {
                if (i > 0) {
                    ipAddrStr += ".";
                }
                ipAddrStr += ipAddr[i] & 0xFF;
            }
        } catch (UnknownHostException e) {
            //获取IP地址异常
            System.out.println(e);
        }
        if (StringUtils.isBlank(ipAddrStr)) {
            ipAddrStr = "0.0.0.0";
        }
        return ipAddrStr;
    }

    /**
     * 随机生成国内IP地址
     */
    public static String getRandomIp() {
        //ip范围
        int[][] range = {{607649792, 608174079},//36.56.0.0-36.63.255.255
                {1038614528, 1039007743},//61.232.0.0-61.237.255.255
                {1783627776, 1784676351},//106.80.0.0-106.95.255.255
                {2035023872, 2035154943},//121.76.0.0-121.77.255.255
                {2078801920, 2079064063},//123.232.0.0-123.235.255.255
                {-1950089216, -1948778497},//139.196.0.0-139.215.255.255
                {-1425539072, -1425014785},//171.8.0.0-171.15.255.255
                {-1236271104, -1235419137},//182.80.0.0-182.92.255.255
                {-770113536, -768606209},//210.25.0.0-210.47.255.255
                {-569376768, -564133889}, //222.16.0.0-222.95.255.255
        };

        Random rd = new Random();
        int index = rd.nextInt(10);
        return num2ip(range[index][0] + new Random().nextInt(range[index][1] - range[index][0]));
    }

    /**
     * 将十进制转换成ip地址
     */
    public static String num2ip(int ip) {
        int[] b = new int[4];
        b[0] = (int) ((ip >> 24) & 0xff);
        b[1] = (int) ((ip >> 16) & 0xff);
        b[2] = (int) ((ip >> 8) & 0xff);
        b[3] = (int) (ip & 0xff);
        return Integer.toString(b[0]) + "." + Integer.toString(b[1]) + "." + Integer.toString(b[2]) + "." + Integer.toString(b[3]);
    }

}
